// 设置pinia的user管理
import { defineStore } from 'pinia'
import { ref, reactive } from 'vue'
import { getToken, setToken, removeToken } from '@/utils/storage'
import { login, logout, register } from '@/api/user'

export const useUserStore = defineStore('user', () => {
  // 将获得的token赋值给pinia的token
  const token = ref(getToken() || '')
  const UserInfo = reactive({})

  const setTokenPinia = (newToken) => {
    token.value = newToken
    // 同时将token 存到浏览器的localStorage
    setToken(newToken)
  }

  const clearTokenPinia = () => {
    token.value = ''
    removeToken()
  }

  const setUserInfoPinia = (info) => {
    // 安全的设置userInfo对象
    Object.assign(UserInfo, info)
  }

  // 清除用户信息但是保留token  退出登录的方法会调用这个方法  那里会清除token
  const clearUserInfoPinia = () => {
    Object.assign(UserInfo, {})
  }

  // 登录发送请求的方法 接收一个表单数据loginadmin
  const loginPinia = async (loginForm) => {
    try {
      const res = await login(loginForm)
      // 如果拿到结果 先将token存起来 (包括pinia的浏览器的)
      setTokenPinia(res.data.token)
      // 返回响应
      return { success: true, data: res }
    } catch (error) {
      return { success: false, data: error }
    }
  }
  // 退出登录的方法  先认证再清除token和用户信息
  const logoutPinia = async () => {
    try {
      // 1. 先调用后端退出接口（使用当前有效token认证）
      const res = await logout()

      // 2. 后端认证成功后，清除本地token和用户信息
      if (res.data.status === 200) {
        clearTokenPinia()
        clearUserInfoPinia()
        return { success: true, data: res }
      } else {
        // 后端返回非200状态，也清除本地状态
        clearTokenPinia()
        clearUserInfoPinia()
        return { success: false, data: res }
      }
    } catch (error) {
      // 3. 如果后端调用失败，也清除本地状态
      clearTokenPinia()
      clearUserInfoPinia()
      return { success: false, data: error }
    }
  }

  const registerPinia = async (registerForm) => {
    try {
      const res = await register(registerForm)
      if (res.data.status === 400) {
        return { success: false, data: res }
      }
      return { success: true, data: res }

    } catch (error) {
      return { success: false, data: error }
    }
  }

  return {
    token,
    UserInfo,
    setTokenPinia,
    clearTokenPinia,
    setUserInfoPinia,
    clearUserInfoPinia,
    loginPinia,
    logoutPinia,
    registerPinia
  }
})
